import {useBackHandler} from '@react-native-community/hooks';
import dayjs from 'dayjs';
import React, {useEffect, useState} from 'react';
import {
  StyleSheet,
  View,
  Button,
  Alert,
  Text,
  Dimensions,
  useWindowDimensions,
  Platform,
  Linking,
  PixelRatio,
  BackHandler,
  PermissionsAndroid,
  Vibration,
  ToastAndroid,
  Keyboard,
  TextInput,
} from 'react-native';

const alert_console8_2 = React.memo(() => {
  const onPress = () => {
    // alert('这是一条提示信息');
    // alert(123);
    // alert(false);
    // const buttons = [
    //   {text: '取消', onPress: () => console.log('取消')},
    //   {text: '确定', onPress: () => console.log('确定')},
    // ];

    // Alert.alert('这是标题', '这是一条提示信息', buttons);
    // console.log('这是普通的日志输出');
    // console.info('信息日志输出');
    // console.debug('调试日志输出');
    // console.warn('警告日志输出');
    // console.error('错误日志输出');
    // console.log('我是个人开发者%s，我学习RN%d年半了', '张三', 2);
    // const obj = {name: '张三', age: 12};
    // console.log('我是一个对象:%o', obj);
    // console.log('%c这行日志红色文字，字号大', 'color:red; font-size:x-large');
    // console.log('%c这行日志蓝色文字，字号中', 'color:blue; font-size:x-medium');
    // console.log('%c这行日志绿色文字，字号小', 'color:green; font-size:x-small');
    // const viewLayout = (
    //   <View style={{flexDirection: 'column'}}>
    //     <Text style={{fontSize: 20, color: 'red'}}>文字显示</Text>
    //   </View>
    // );
    // console.log(viewLayout);
    // const users = [
    //     {name: '张三', age: 12, hobby: '唱歌'},
    //     {name: '李四', age: 15, hobby: '跳舞'},
    //     {name: '王武', age: 18, hobby: '打篮球'},
    // ];
    // console.table(users);
    // console.group();
    // console.log('第1行日志');
    // console.log('第2行日志');
    // console.log('第3行日志');
    // console.group();
    // console.log('二级分组第1行日志');
    // console.log('二级分组第2行日志');
    // console.log('二级分组第3行日志');
    // console.groupEnd();
    // console.groupEnd();
    // const {width, height, scale, fontScale} = Dimensions.get('window');
    // console.log(`width=${width}, height=${height}`);

    /**---Platform获取平台属性 */
    // console.log(Platform.OS);
    // console.log(Platform.Version); // sdk的v版本
    // console.log(Platform.constants);
    // console.log(Platform.isPad); // 为ios定制的
    // console.log(Platform.isTV);
    // const style = Platform.select({
    //   android: {
    //     marginTop: 20,
    //   },
    //   ios: {
    //     marginTop: 0,
    //   },
    //   default: {
    //     marginTop: 10,
    //   },
    // });
    // console.log(style); //  {"marginTop": 20}

    /* -----styleSheet的一些其它用法 */
    // const s1 = {
    //     fontSize: 18,
    // };
    // const s2 = {
    //     fontSize: 20,
    //     color: 'red',
    // };
    // const composeStyle = StyleSheet.compose(s1, s2);
    // composeStyle.push(s2)
    // console.log(composeStyle);
    // const flattenStyle = StyleSheet.flatten([s1, s2]); // 返回一个平铺的对象，如果属性重复后面的会覆盖前面的
    // console.log(flattenStyle);
    // console.log(StyleSheet.absoluteFill);

    /* ---这个相当于下面的代码，由于1逻辑像素 =  Dimensions.get('screen').scale px个物理像素，那么1px个物理像素的逻辑像素 = 1 / Dimensions.get('screen').scale 个物理像素 */
    // console.log(StyleSheet.hairlineWidth, `\tStyleSheet.hairlineWidth`);
    // console.log(
    //   1 / Dimensions.get('screen').scale,
    //   `\t1 / Dimensions.get('screen').scale\t`,
    //   Dimensions.get('screen').scale,
    // );

    /*----Linking的一些用法  */
    // if (Linking.canOpenURL('https://www.baidu.com/')) {
    //     Linking.openURL('https://www.baidu.com/');
    // }
    // Linking.openURL('geo:37.2122, 12.222');
    // Linking.openURL('tel:10086');
    // Linking.openURL('smsto:10086');
    // Linking.openURL('mailto:10086@qq.com');
    /* --要在原生层写一个原生的页面 */
    // Linking.openURL('dagongjue://demo?name=李四');
    // Linking.openSettings(); // 打开设置页面
    // if (Platform.OS === 'android') {
    //     Linking.sendIntent('com.dagongjue.demo.test', [{key: 'name', value: '王武'}]); //也要去xml配置一下
    // }
    // console.log(`Linking.getInitialURL: \t`, Linking.getInitialURL()); //通过url打开，可以获取这个url

    /* ------PixelRatio 像素比例工具---- */
    // 这两个获取的值 一样的
    // console.log(PixelRatio.get(), '\t', Dimensions.get('screen').scale);
    // 一般在安卓中的
    // console.log(PixelRatio.getFontScale());
    // 转换逻辑像素  为  真实的物理像素  和后面的一个道理一样的结果
    // console.log(
    //   PixelRatio.getPixelSizeForLayoutSize(200),
    //   '\t',
    //   200 * PixelRatio.get(),
    // );
    // 将布局大小（dp）舍入为与整数像素相对应的最接近的布局大小。例如，在PixelRatio为3的设备上，PixelRatio.roundToNearestPixel（8.4）=8.33，正好对应于（8.33*3）=25个像素。
    // console.log('roundToNearestPixel: \t',PixelRatio.roundToNearestPixel(32.1));

    /* ---backHandler */
    // BackHandler.exitApp();  //退出app

    /* ----PermissionsAndroid 轻松解决权限问题*/
    const needPermission =
      PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE;
    console.log(needPermission);
    PermissionsAndroid.check(needPermission).then(result => {
      console.log(result); // 检查某项权限是否经过用户授权。返回一个 promise，解析为布尔值
      if (!result) {
        PermissionsAndroid.request(needPermission, {
          title: '照片选择操作所需的权限',
          message: '请您确认同意按钮',
          buttonPositive: '同意',
          buttonNegative: '拒绝',
          buttonNeutral: '稍后',
        }).then(status => {
          console.log(status, '\tstatus');
          if (status === 'granted') {
            //获得
          } else if (status === 'denied') {
            //拒绝
          } else if ((status = 'never_ask_again')) {
            // 表示用户已拒绝，且不愿被再次询问。

            Alert.alert('需要权限', '你需要手动开启权限', [
              {
                text: '确定',
                onPress: () => Linking.openSettings(),
              },
            ]);
          }
        });
      }
    });

    // PermissionsAndroid.requestMultiple([
    //     PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
    //     PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
    // ]);
  };

  const [test, settest] = useState(100);

  useEffect(() => {
    // console.log(
    //   '--------------------------------====8_2Alert_console_platform_linking_PixelRatio_BackHandler',
    // );
    /*----backHandler监听物理返回键，并可以拦截冒泡  */
    BackHandler.addEventListener('hardwareBackPress', backForAndroid); // 如果想要在backForAndroid中使用最新的test就要监听test，来重新监听

    let timer = setTimeout(() => {
      console.log('setTimeout——————');
      if (test >= 300) return clearTimeout(timer);
      settest(nowVal => {
        return nowVal + 100;
      });
    }, 2000);

    return () => {
      console.log('removeListener', test); //这里的test总是之前的老值
      BackHandler.removeEventListener('hardwareBackPress', backForAndroid);
      clearTimeout(timer);
    };
  }, [test]);

  function backForAndroid(str) {
    console.log(test, '\t', dayjs(Date.now(), '\t'));
    return false; //true 拦截掉，事件不用冒泡了
  }

  // 使用社区包的hooks
  useBackHandler(() => {
    console.log('useBackHandler from community---');

    return false; // true 的话就拦截了
  });
  console.log(`++++++注意这个backForAndroid里的test是几`, backForAndroid()); // 注意这个backForAndroid里的test是几

  /* --官方例子 */
  const requestCameraPermission = async () => {
    try {
      const granted = await PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.CAMERA,
        {
          title: 'Cool Photo App Camera Permission',
          message:
            'Cool Photo App needs access to your camera ' +
            'so you can take awesome pictures.',
          buttonNeutral: 'Ask Me Later',
          buttonNegative: 'Cancel',
          buttonPositive: 'OK',
        },
      );
      if (granted === PermissionsAndroid.RESULTS.GRANTED) {
        console.log('You can use the camera');
      } else {
        console.log('Camera permission denied');
      }
    } catch (err) {
      console.warn(err);
    }
  };
  return (
    <View style={styles.root}>
      <Text
        style={{color: 'red', fontSize: 12, textAlign: 'center'}}
        numberOfLines={1}
        ellipsizeMode="tail">
        8_2-9Alert_console_platform_linking_PixelRatio_BackHandler_PermissionsAndroid
      </Text>

      <Button title="按钮" onPress={onPress} />

      <Text style={styles.item}>Try permissions</Text>
      <Button title="按钮permission" onPress={requestCameraPermission} />

      {/* 这里我们看到背景有一些瑕疵 */}
      <View style={styles.view}>
        <View style={styles.subView} />
        <View style={styles.subView} />
        <View style={styles.subView} />
        <View style={styles.subView} />
        <View style={styles.subView} />
        <View style={styles.subView} />
        <View style={styles.subView} />
        <View style={styles.subView} />
        <View style={styles.subView} />
        <View style={styles.subView} />
      </View>
      {/* 使用 StyleSheet.absoluteFill 简写好几个absolute*/}
      <View
        style={{
          ...StyleSheet.absoluteFill,
          backgroundColor: '#20561350',
          zIndex: -1,
        }}
      />
    </View>
  );
});

export default alert_console8_2;

const styles = StyleSheet.create({
  root: {
    width: '100%',
    height: 'auto',
    /* 写法一 */
    paddingTop: Platform.select({
      android: 20,
      ios: 10,
      default: 0,
    }),
    /* 写法二 */
    ...Platform.select({
      android: {
        paddingRight: 20,
      },
      ios: {
        paddingRight: 0,
      },
      default: {
        paddingRight: 10,
      },
    }),
  },
  view: {
    width: '100%',
    backgroundColor: 'red',
  },
  subView: {
    width: '100%',
    backgroundColor: 'green',
    // height: PixelRatio.roundToNearestPixel(32.1),
    height: 32.1,
  },
  item: {
    margin: 24,
    fontSize: 18,
    fontWeight: 'bold',
    textAlign: 'center',
  },
});
